package main

import (
	"log"
	"os"
	"path/filepath"
	"runtime"

	"dnslog/config"
	"dnslog/core"
	httprouter "dnslog/httpRouter"
)

func main() {
	// 检查必要目录
	checkRequiredDirs()

	// 加载配置文件
	config, err := config.LoadConfig("../config/config.yaml")
	if err != nil {
		log.Fatalf("❌ 配置加载失败: %v", err)
	}

	// 初始化日志
	initLogger(config)

	log.Printf("=== DNSLOG Platform Starting ===")
	log.Printf("Working directory: %s", getWorkingDir())
	log.Printf("Config loaded from: config.yaml")
	log.Printf("Domain: %s", config.Server.Domain)
	log.Printf("Admin Server: https://%s", config.GetAdminAddr())
	log.Printf("Front Server: http://%s", config.GetFrontAddr())
	log.Printf("DNS Server: %s", config.GetDNSAddr())

	// 创建 DNSLOG 平台
	platform := core.NewDNSLogPlatform(config)

	// 创建 HTTP 路由器
	router := httprouter.NewRouter(platform, config)

	// 启动 DNS 服务器
	go func() {
		log.Printf("DNS server starting on %s", config.GetDNSAddr())
		if err := platform.StartDNSServer(config.GetDNSAddr()); err != nil {
			log.Fatalf("Failed to start DNS server: %v", err)
		}
	}()

	// 启动 HTTP 服务器
	log.Printf("Starting HTTP servers...")
	if err := router.Start(); err != nil {
		log.Fatalf("Failed to start HTTP servers: %v", err)
	}
}

// getProjectRoot 获取项目根目录
func getProjectRoot() string {
	// 方法1: 获取当前执行文件的路径
	_, filename, _, _ := runtime.Caller(0)
	projectRoot := filepath.Dir(filepath.Dir(filename))

	// 方法2: 如果方法1失败，使用工作目录
	if _, err := os.Stat(filepath.Join(projectRoot, "templates")); os.IsNotExist(err) {
		wd, err := os.Getwd()
		if err == nil {
			// 如果当前在cmd目录，向上退一级
			if filepath.Base(wd) == "cmd" {
				projectRoot = filepath.Dir(wd)
			} else {
				projectRoot = wd
			}
		}
	}

	return projectRoot
}

// getWorkingDir 获取工作目录
func getWorkingDir() string {
	wd, err := os.Getwd()
	if err != nil {
		log.Printf("⚠️  Warning: Cannot get working directory: %v", err)
		return "."
	}
	return wd
}

// checkRequiredDirs 检查必要目录
func checkRequiredDirs() {
	projectRoot := getProjectRoot()

	log.Printf("📁 Project root: %s", projectRoot)
	log.Printf("📁 Current working directory: %s", getWorkingDir())

	// 检查 templates 目录
	templatesDir := filepath.Join(projectRoot, "templates")
	if _, err := os.Stat(templatesDir); os.IsNotExist(err) {
		log.Fatalf("❌ Templates directory not found: %s", templatesDir)
	}

	// 检查 templates/index.html 文件
	templateFile := filepath.Join(templatesDir, "index.html")
	if _, err := os.Stat(templateFile); os.IsNotExist(err) {
		log.Fatalf("❌ Template file not found: %s", templateFile)
	}

	log.Printf("✅ All required directories and files found")
}

// 初始化日志
func initLogger(cfg *config.Config) {
	if cfg.Log.File != "" {
		file, err := os.OpenFile(cfg.Log.File, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
		if err != nil {
			log.Fatalf("Failed to open log file: %v", err)
		}
		log.SetOutput(file)
	}

	// 设置日志前缀
	log.SetFlags(log.LstdFlags | log.Lshortfile)
}
